#include "client.h"

/**
 * @brief	检查字符串是否只包含空白字符
 * @param  str: 要检查的字符串
 * @retval 如果字符串只包含空白字符返回 true，否则返回 false
 */
static bool is_only_whitespace(const char* str) {
  while (*str == ' ' || *str == '\n' || *str == '\t') {
    if (*str == '\n') {
      // 找到换行符，表示用户只按了 Enter
      return true;
    }
    str++;
  }
  return *str == '\0';  // 字符串结束，只包含空白字符
}

/**
 * @brief	字符串分割
 * @note   输入一个可能开头有空格的字符串，如 "   pwd" 或 "    xxx       /yy/yy/
 * "，根据条件进行处理
 * @param  msg: 一个 data 结构体
 * @param  src: 一个可能开头有空格的字符串
 * @retval 如果处理成功返回 true，否则返回 false
 */
bool string_concat(data* msg, char* src) {
  if (msg == NULL || src == NULL) {
    return false;
  }

  if (is_only_whitespace(src)) {
    strcpy(msg->command, "");  // 命令为空
    strcpy(msg->args, "");     // 参数为空
    return true;
  }

  // 跳过字符串开头的空格
  char* start_ptr = src;
  while (*start_ptr == ' ' && *start_ptr != '\0') {
    start_ptr++;
  }

  // 检查是否是换行符
  if (*start_ptr == '\n') {
    strcpy(msg->command, "");  // 命令为空
    printf("换行成功");
    strcpy(msg->args, "\n");  // 参数为换行符
    return true;
  }

  // 检查字符串是否为 "pwd" 或 "ls"
  char* end_ptr = start_ptr;
  while (*end_ptr != '\0' && *end_ptr != ' ') {
    end_ptr++;
  }

  size_t command_len = end_ptr - start_ptr;
  if (*end_ptr == '\0' &&
      (command_len == 3 && strncmp(start_ptr, "pwd", 3) == 0 ||
       command_len == 2 && strncmp(start_ptr, "ls", 2) == 0 ||
       command_len == 2 && strncmp(start_ptr, "cd", 2) == 0)) {
    strncpy(msg->command, start_ptr, command_len);
    msg->command[command_len] = '\0';  // 确保字符串以 null 结尾
    strcpy(msg->args, "");             // 没有参数
    return true;
  }

  // 处理包含空格的情况
  if (*end_ptr == ' ') {
    strncpy(msg->command, start_ptr, command_len);
    msg->command[command_len] = '\0';  // 确保命令以 null 结尾

    // 跳过命令和参数之间的空格
    char* args_start = end_ptr + 1;
    while (*args_start == ' ') {
      args_start++;
    }

    char* args_end = msg->args;
    while (*args_start != '\0') {
      *args_end++ = *args_start++;
    }
    *args_end = '\0';  // 确保参数字符串以 null 结尾
    return true;
  }

  return false;
}